/**
 * @copyright Copyright (c) 2025 
 * CSG Digital Grid Technology (Guangdong) Co., Ltd.
 * @author xxxcsg
 * @brief 特定格式参数解析工具函数
 * @details 解析以「param: 」为前缀的字符串，提取键值对并添加到 JSON 对象，核心功能如下：
 *          1. 格式匹配：仅处理以「param: 」为前缀的字符串，过滤非目标格式内容
 *          2. 键值提取：按「=」分割字符串，分离参数名（key）和参数值（value）
 *          3. 值清洗：通过 filterchar 函数去除参数值中的换行符（\n）、回车符（\r）及末尾空格，避免无效字符干扰
 *          4. 灵活过滤：支持两种解析模式（uselist=1 时仅保留指定参数列表中的键值对，uselist≠1 时保留所有解析到的键值对）
 *          5. JSON 封装：将处理后的键值对以字符串类型添加到目标 cJSON 对象中
 * @note 1. 依赖组件：cJSON 库（JSON 对象操作）、标准 C 库（字符串处理）
 *       2. 输入格式约束：目标字符串需严格遵循「param: key=value」格式，缺少前缀或「=」时会跳过解析
 *       3. 参数列表：uselist=1 时，params 数组需提前指定需保留的参数名，param_count 为数组长度
 *       4. 数据类型：所有解析后的参数值均以字符串类型存入 JSON，若需其他类型需后续手动转换
 * @attention 1. 需确保输入的 line、params、root 参数非空，否则可能导致未定义行为
 *            2. filterchar 函数会直接修改 value 指向的字符串内容，若需保留原始字符串需提前备份
 *            3. 若同一 key 多次出现，后解析的 value 会覆盖之前的值（遵循 cJSON_AddStringToObject 特性）
 */
#include "paramparse.h"


static void filterchar(char *str) {
    int len = strlen(str);
    int i = 0;
    while(i < len) {
        if(str[i] == '\n' || str[i] == '\r') {
            // printf("%c", str[i]);
            str[i] = '\0';
            break;
        }    
        i++; 
    }
    if (str[i-1] == ' ') str[i-1] = '\0';
    return;  
} 

void parse_param(int uselist, const char* line, const char** params, int param_count, cJSON* root) {
    const char* prefix = "param: ";
    char* param_start = strstr(line, prefix);
    if (!param_start) return;
    
    param_start += strlen(prefix);
    char* equal_sign = strchr(param_start, '=');
    if (!equal_sign) return;
    
    *equal_sign = '\0';
    const char* key = param_start;
    char* value = equal_sign + 1;
    filterchar(value);

    if (uselist == 1) {
        for (int i = 0; i < param_count; i++) {
            if (strcmp(key, params[i]) == 0) {
                //printf("getbegetctl-----------uselist == 1 value:%s\n", value);
                cJSON_AddStringToObject(root, key, value);
                //json_object_set_new(root, key, json_string(value));
                break;
            }
        }
    } else {
        //printf("getbegetctl-----------else value:%s\n", value);
        cJSON_AddStringToObject(root, key, value);
    }
}

